/*
 Semantic Versioning是一个前端通用的版本定义规范。格式为“{MAJOR}.{MINOR}.{PATCH}-{alpha|beta|rc}.{number)"，要求实现compare(a,b)方法，比较ab两个版本大小。
   + 当a>b是返回1;
   + 当a=b是返回0;
   + 当a<b是返回-1;
   其中：rc>beta>alpha，major>minor>patch;
   例子：1.2.3<1.2.4<1.3.0.alpha.1<1.3.0.alpha.2<1.3.0.beta.1<1.3.0.rc.1<1.3.0
 */
const compare = (a, b) => {
    let reg,
        temp,
        flag = 0,
        n = -1;
    // 校验版本号格式合法性
    reg = /^\d+(\.\d+){2}(\.(alpha|beta|rc)\.\d+)?$/;
    if (!reg.test(a) || !reg.test(b)) throw new TypeError('请确保版本号格式正确');
    // 拆分版本号为数组
    a = a.split('.');
    b = b.split('.');
    // 基于递归方案:分别比较版本号中的每一项
    const recur = () => {
        n++;
        let item1 = a[n],
            item2 = b[n];
        // case1:其中有一项(或者两项)不存在
        if (!item1 || !item2) {
            flag = (!item1 && !item2) ? 0 : (!item1 ? 1 : -1);
            return;
        }
        // case2:正常两两比较(PS:需要考虑值不是数字的情况)
        temp = (!isNaN(item1) && !isNaN(item2)) ? (item1 - item2) : (item1.localeCompare(item2));
        if (temp === 0) {
            // 两项相等则继续比较后面的
            recur();
            return;
        }
        flag = temp > 0 ? 1 : -1;
    };
    recur();
    return flag;
};